﻿using FlyIL;
using FlyIL.Trace;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using static FlyIL.AssemblerRegisters;

namespace FlyIl.AdvanceTests.Trace
{
    [TestClass()]
    public class 中间数被修改的情况
    {

        [TestMethod()]
        public void t111()
        {
                // !!! 追踪的表达式, 是否有效, 是要根据 追踪的操作数而言的 
            Context vcontext;


            {

                vcontext = new Context(false);


                vcontext.Make().push(R1D);
                vcontext.Make().add(R1D, 1);
                vcontext.Make().pop(R2D);

                // 如果是 追踪 R2D  , mov r2d , r1d 是无意义的 


                var exp = vcontext.TraceStrict(vcontext.Last, ref vcontext.Last.O1);
                Assert.IsFalse(exp.IsValid);
            }

            {

                vcontext = new Context(false);


                vcontext.Make().push(R1D);
                vcontext.Make().add(R1D, 1);
                vcontext.Make().pop(R1D);

                // 如果是 追踪 R1D  , 那么化简为 mov r1d,r1d 是意义的, 


                var exp = vcontext.TraceStrict(vcontext.Last, ref vcontext.Last.O1);
                Assert.IsTrue(exp.IsValid);
            }


        }



        [TestMethod()]
        public void t222()
        {
            Context vcontext;


            vcontext = new Context(false);


            vcontext.Make().mov(R1D, R3D);  // 需要追踪  r3d 有无被修改 
            vcontext.Make().nop();
            vcontext.Make().nop();
            vcontext.Make().nop();
            vcontext.Make().nop();
            vcontext.Make().add(R3D, 1);
            vcontext.Make().mov(R2D, R1D);

            var exp = vcontext.TraceStrict(vcontext.Last, ref vcontext.Last.O1);
            Assert.IsFalse(exp.IsValid);


        }



        [TestMethod()]
        public void t333()
        {
            Context vcontext;


            vcontext = new Context(false);


            vcontext.Make().add(R1D, R3D);  // 需要追踪  r3d 有无被修改 
            vcontext.Make().nop();
            vcontext.Make().nop();
            vcontext.Make().nop();
            vcontext.Make().nop();
            vcontext.Make().add(R3D, 1);
            vcontext.Make().mov(R2D, R1D);

            var exp = vcontext.TraceStrict(vcontext.Last, ref vcontext.Last.O1);
            Assert.IsFalse(exp.IsValid);


        }
    }
}
